<?php
/**
 * Controller_Article
 *
 * Класс Controller_Article отвечает за обработку статей
 *
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.0
 */
class Controller_Question extends Controller_Base {

	/**
	 * Выбор действия по URL
	 *
	 */
	public function action() {
		Service_Debug::setDebug();
		switch ($this->arrRequest[1]) {
			case '': case 'list':
				if(isset($_GET['page'])) $pageNumber = $_GET['page']; // Записываем номер страницы, которую нужно показать
				else $pageNumber = 1; // По умолчанию выводим первую страницу
				
				$objQuestion = new Question();
				// Считаем количество страниц для текущей навигации и проверяем корректность данных из GET
				$essenceCount = $objQuestion->count();
				$pagesNumber = ceil($essenceCount / $objQuestion->essenceNumberOnPage); // Необходимое количество страниц для навигации
				// Если GET пуст или в нём указан правильный номер страницы
				if(!$_GET || ($pageNumber <= $pagesNumber && preg_match("/^[1-9]{1}[\d]*$/",$pageNumber))) $this->actionList($objQuestion,null,$pagesNumber,$pageNumber,$essenceCount['count']);
				else $this->setError(404);
			  break;
			case 'add':
				$this->actionAdd();
				break;
			case 'edit':
				if (!is_numeric($this->arrRequest[2])) $this->setError(404);
				else {
					$objQuestion= new Question($this->arrRequest[2]);
					if ($objQuestion->id) {
						if(SimpleAdministration::isAuthorOrAdmin($objQuestion->getField('ID_user'))) $this->actionEdit($objQuestion);
						else $this->setError(403);
					}
					else $this->setError(404);
				}
				break;
			default:
				if (is_numeric($this->arrRequest[1]) && !$this->arrRequest[2]) {
					$objQuestion = new Question($this->arrRequest[1]);
					if ($objQuestion->id) $this->actionShowOne($objQuestion);
					else $this->setError(404);
				}
				else $this->setError(404);
				break;
		}
	}

	/**
	 * Выводит страницу конкретного вопроса
	 *
	 * @param Question $objQuestion - объект вопроса
	 */
	public function actionShowOne(Question $objQuestion) {
		Service_Debug::setDebug();
		if (isset($_POST['Answer'])) { // Сохранение ответа на вопрос
			$objAnswer = new Answer($_POST['Answer']);
			if ($objAnswer->save()) User_Session::moveTo(W_ABSPATH . 'questions/' . $objQuestion->id , 'Ответ на вопрос добавлен успешно', 1);
		}
		
		if (!isset($_COOKIE['Question_' . $objQuestion->id])) { // Если для этого вопроса нет куки, то наращиваем его счётчик просмотров, и записываем куку
			$objQuestion->increaseCounter();
			setcookie('Question_' . $objQuestion->id, 1, time() + 86400, W_ABSPATH);
		}
		
		$objCategory = new Category($objQuestion->getField('ID_category'));
		$objAnswer = new Answer();
		// Массив ответов на вопрос
		$arrAnswers = $objAnswer->find('all', array ('select' => '`answer`.`ID_answer`,`answer`.`is_read`,`answer`.`text`,`answer`.`created_at`,`answer`.`rating`,`answer`.`is_the_best`,`user`.`user_type`,`user`.`first_name`,`answer`.`ID_user` as `ID_answer_author`,`user`.`last_name`', 'joins' => 'INNER JOIN `user` USING(`ID_user`)','conditions' => "`ID_question`='" . $objQuestion->id . "'", 'order' => '`answer`.`created_at` ASC'));
		// Массив айдишников ответов для которых нужно искать комментарии
		$arrAnswersIds = Service_ArrayConverter::getColumn($arrAnswers, 'ID_answer');
		// Массив комментариев для ответов, найденных выше
		$arrComments = array();
		if($arrAnswersIds) $arrComments = $objAnswer->find('all',array('select' => '`user`.`ID_user` AS `comment_author`,`user`.`first_name`,`user`.`last_name`,`user`.`user_type`,`question_comment`.`ID_question_comment`,`question_comment`.`ID_answer`,`question_comment`.`ID_user`,`question_comment`.`text`,`question_comment`.`created_at`', 'joins' => 'LEFT JOIN `question_comment` USING (`ID_answer`) INNER JOIN `user` ON `user`.`ID_user`=`question_comment`.`ID_user`', 'conditions' => '`answer`.`ID_answer` IN(' . join(',', $arrAnswersIds) . ')','order' => '`question_comment`.`created_at` ASC'));
		// Полный массив (ответы и комментарии к ним)
		$resultArr = Service_ArrayConverter::combineArrays($arrAnswers, $arrComments, 'ID_answer', 'comments');
		
		$this->title = $objQuestion->getField('question_name');
		$objViewQuestion = new View_Question();
		$this->bodyAttrs = 'class="question"';
		$this->showHeader();
		$objViewQuestion->ShowOne($objQuestion,$objCategory, &$resultArr);
		$this->showFooter();
	}
	
	/**
	 * Выводит список существующих вопросов
	 * @param Question $objQuestion - объект вопроса
	 * @param Category $objCategory - объект категории, вопросы которой выводятся
	 * @param int $pagesNumber - количество страниц для навигации
	 * @param int $pageNumber - номер страницы
	 * @param int $essenceCount - количество заданных вопросов
	 */
	public function actionList($objQuestion, $objCategory, $pagesNumber, $pageNumber, $essenceCount) {
		Service_Debug::setDebug();
	  	// Получаем либо список всех вопросов либо только вопросов конкретной категории
		if(!$objCategory) $tempArrQuestions = $objQuestion->find('all', array('select' => '
																					`user`.`ID_user`,
																					`user`.`first_name`,
																					`user`.`last_name`,
																					`user`.`user_type`,
																					COUNT(`answer`.`ID_answer`) AS answers,
																					`question`.`ID_question`,
																					`question`.`viewings`,
																					`question`.`created_at`,
																					`question`.`question_name`',
																 				'joins' => '
																					LEFT JOIN `user` ON `user`.`ID_user` = `question`.`ID_user` 
																					LEFT JOIN `answer` ON `question`.`ID_question` = `answer`.`ID_question`',
																				 'group' => '
																					`question`.`ID_question`',
																				 'order' =>
																					 '`question`.`created_at` DESC',
																				 'limit' => $pageNumber * $objQuestion->essenceNumberOnPage));
		elseif ($objCategory->id) $tempArrQuestions = $objQuestion->find('all', array('select' => '
																					`user`.`ID_user`,
																					`user`.`first_name`,
																					`user`.`last_name`,
																					`user`.`user_type`,
																					COUNT(`answer`.`ID_answer`) AS answers,
																					`question`.`ID_question`,
																					`question`.`viewings`,
																					`question`.`created_at`,
																					`question`.`question_name`',
																 				'joins' => ' 
																					LEFT JOIN `category` ON `category`.`ID_category` = `question`.`ID_category`
																					LEFT JOIN `user` ON `user`.`ID_user` = `question`.`ID_user` 
																					LEFT JOIN `answer` ON `question`.`ID_question` = `answer`.`ID_question`',
																				 'group' => '
																					`question`.`ID_question`',
																				 'order' =>
																					 '`question`.`created_at` DESC',
																				 'limit' => 
																						$pageNumber * $objQuestion->essenceNumberOnPage,
																				 'conditions' => 
																						"`question`.`ID_category`='" . $objCategory->id . "'")); 
		else $tempArrQuestions = $objQuestion->find('all', array('select' => '
																					`user`.`ID_user`,
																					`user`.`first_name`,
																					`user`.`last_name`,
																					`user`.`user_type`,
																					COUNT(`answer`.`ID_answer`) AS answers,
																					`question`.`ID_question`,
																					`question`.`viewings`,
																					`question`.`created_at`,
																					`question`.`question_name`',
																 				'joins' => ' 
																					LEFT JOIN `category` ON `category`.`ID_category` = `question`.`ID_category`
																					LEFT JOIN `user` ON `user`.`ID_user` = `question`.`ID_user` 
																					LEFT JOIN `answer` ON `question`.`ID_question` = `answer`.`ID_question`',
																				 'group' => '
																					`question`.`ID_question`',
																				 'order' =>
																					 '`question`.`created_at` DESC',
																				 'limit' => 
																						$pageNumber * $objQuestion->essenceNumberOnPage,
																				 'conditions' => 
																						'`question`.`ID_category` IS NULL')); 
		
		// Номер первого отображаемого вопроса на странице
		$firstQuestion = ($pageNumber - 1) * $objQuestion->essenceNumberOnPage;
		// Номер последней отображаемой статьи на странице
		$lastQuestion = $firstQuestion + $objQuestion->essenceNumberOnPage;  
	  	for ($k=$firstQuestion;$k<$lastQuestion;$k++) {
	  		if (isset($tempArrQuestions[$k])) $arrQuestions[] = $tempArrQuestions[$k];
	  	}
	  	
	  	if ($objCategory == null) $this->title = $this->pageHead = 'Все вопросы';
	  	elseif ($objCategory->id) $this->title = $this->pageHead = $objCategory->getField('category_name');
	  	else $this->title = $this->pageHead = 'Вопросы без категории';
	  	$this->addUrl = W_ABSPATH . 'questions/add/';

	 	$objViewQuestion = new View_Question();
	  	$this->showHeader();
	    $objViewQuestion->showAdminList(&$arrQuestions, $objCategory, $pagesNumber, $pageNumber, $essenceCount);
		$this->showFooter();
	}
	
	/**
	 * Страница добавления Вопросов
	 */
	public function actionAdd() {
		Service_Debug::setDebug();
		$objSession = User_Session::instance();
	    if (isset($_POST['Question'])) { // Если пришли данные POST
	    		$objQuestion = new Question($_POST['Question']);
				if ($objQuestion->save()) User_Session::moveTo(W_ABSPATH . 'questions/' . $objQuestion->id , 'Вопрос добавлен успешно добавлен', 1);
		}
		else $objQuestion = new Question();
		$this->showLeftColumn = false;
	  	$this->pageHead = 'Задать вопрос';
	  	$objViewQuestion = new View_Question();

	  	$this->showHeader();
	    $objViewQuestion->showAddForm($objQuestion);
		$this->showFooter();
	}
	
  /**
   * Выводит страницу редактирования статьи
   * 
   * @param Article $objArticle - объект статьи для редактирования
   */
  public function actionEdit(Question $objQuestion) {
  	$editId = $objQuestion->id;
	if (isset($_POST['Question'])) {
		$objQuestion = new Question($_POST['Question']);
		if ($objQuestion->id != $editId) User_Session::moveTo(View_Base::getLanguageUrl(W_ABSPATH) . 'questions/', Service_Translate::getText('Недопустимое действие'));
		if ($objQuestion->save()) User_Session::moveTo(W_ABSPATH . 'questions/'. $objQuestion->id , 'Вопрос успешно сохранен', 1);
	}
		 
	$objViewQuestion = new View_Question();
	$this->showLeftColumn = true;
	$this->pageHead = $this->title = 'Редактирование вопроса';
	$this->showHeader();
	$objViewQuestion->showEditForm($objQuestion);
	$this->showFooter();
  }
}
?>